package cn.cdeden.resource.api;

import cn.cdeden.common.core.exception.ServiceException;
import cn.cdeden.common.oss.enumd.OssModuleType;
import cn.cdeden.resource.api.domain.RemoteFile;
import cn.cdeden.resource.api.domain.RemoteFileDto;
import jakarta.validation.constraints.NotNull;

import java.util.Collection;
import java.util.List;

/**
 * 文件服务
 *
 * @author Lion Li
 */
public interface RemoteFileService {

    /**
     * 上传文件
     *
     * @param fileDto 文件信息
     * @return 结果
     */
    RemoteFile upload(RemoteFileDto fileDto) throws ServiceException;


    /**
     * 上传封面图片
     *
     * @param coverFile
     * @param coverContentType
     * @param coverSuffix
     * @return
     */
    RemoteFile uploadCoverImage(byte[] coverFile, String coverContentType, String coverSuffix, String ossId);


    /**
     * 删除 封面图片
     *
     * @param ossId 文件编号的字符串
     * @return boolean
     * @author Yu.
     * @Date 2025/2/7 14:29
     **/
    boolean deleteCoverImage(String ossId);


    /**
     * 复制文件
     *
     * @param fileDto    ossId 文件id 必须要填写
     *                   versionId 版本id  可以传不传 就是最新的
     * @param bucketName 目标桶名  必须传
     * @param moduleType 模块类型 必须传
     * @return 结果
     */
    RemoteFile copyFile(RemoteFile fileDto, @NotNull(message = "桶,不可以为空") String bucketName, @NotNull(message = "模块,不可以为空") OssModuleType moduleType) throws ServiceException;


    /**
     * 通过ossId查询对应的url
     *
     * @param ossIds ossId串逗号分隔
     * @return url串逗号分隔
     */
    String selectUrlByIds(String ossIds);


    /**
     * 通过ossId查询对应的封面的url
     *
     * @param ossIds
     * @return java.lang.String
     * @author Yu.
     * @Date 2025/2/6 14:54
     **/
    String selectImageUrlByIds(String ossIds);


    /**
     * 通过storageIds查询列表
     *
     * @param storageId
     * @return cn.cdeden.resource.api.domain.RemoteFile
     * @author Yu.
     * @Date 2024/12/6 9:15
     **/
    RemoteFile selectById(String storageId);


    /**
     * 通过storageIds查询列表
     *
     * @param storageIds storageIds串逗号分隔
     * @return 列表
     */
    List<RemoteFile> selectByIds(String storageIds);


//

    /**
     * 根据ossId和versionId 删除文件
     *
     * @param ids     //文件id
     * @param isValid //是否验证
     * @return java.lang.Boolean 是否删除成功
     * @author Yu.
     * @Date 2024/12/6 16:15
     **/
    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);


}
